#! /usr/bin/python
# -*- coding: utf-8 -*-
#
# text2xhtml.py
#
# Конвертор текстов для Эсперанто-Русского словаря Бориса Кондратьева
# из текстового формата WackoWiki в формат XHTML (ePub/Amazon Kindle).
#
# Описание формата WackoWiki:
# http://wackowiki.org/Doc/English/Formatting
#
# Конвертр поддерживает лишь подмножество языка разметки WackoWiki
# используемое в текстах словаря.
#
# Автор: Егор Чемисов
# Email: yegor.chemisov@gmail.com
# http://ervo.googlecode.com
#

import os
import re

# Каталог, где находятся исходные текстовые файлы словаря
DIR_TEXT 		= "./text/"
DIR_TEMPLATE            = "./templates/"
DIR_MOBI                = "./mobi/"
FILE_EXT_TXT            = ".txt"
FILE_EXT_XHTML          = ".html"

# Patterns

CX2EO = (('cx','ĉ'), ('Cx','Ĉ'), ('gx','ĝ'), ('Gx','Ĝ'),
        ('hx','ĥ'), ('Hx','Ĥ'), ('jx','ĵ'), ('Jx','Ĵ'),
        ('sx','ŝ'), ('Sx','Ŝ'), ('ux','ŭ'), ('Ux','Ŭ'),
)
SYMBOLS = (('<<', '«'), ('>>', '»'), (r'`(.)', r'\1́'), 
	   (r'(?<=[^-])\-\-(?=[^-])', r'&mdash;'), #, ('/', '·')
)

FIX_LINKS = (
    (r'http://eoru.ru/pri/', r'page-1.html'),
    (r'(http://eoru.ru/gram/)(/d+)', r'page-\2.xhtml'),
)    

headingId = 0
def getHeading(match):
    global headingId
    level = len(match.group(1))-1
    text  = match.group(2)
    headingId += 1
    return '<h%d id="heading_id_%d">%s</h%d>' % (level, headingId, text, level)

WACKO2HTML = (
    # Выделяем параграфы (! Доработать: не использовать в <[..]>
    (r'^((\w|\d|[[/]).*?)$',r'<p>\1</p>'),    

    # Headlines
    # Note: Right of the Heading it does not require the same number
    # of "=" characters, it suffice two "=" signs
    (r'(={3,6})([^\n]+?)={2,7}',  getHeading),

    # Basic Formatting
    (r'\*\*(.+?)\*\*',      r'<b>\1</b>'),
    (r'//([^/]+)//',        r'<em>\1</em>'),
    (r'\^\^(.+?)\^\^',      r'<sup>\1</sup>'),        
    (r'<#(.+?)#>',          r'\1'),

    # Links
    (r'\[\[\*(.+?)\]\]', r'<sup><a href="#oftnd\1">\1</a></sup>'),
    (r'\[\[#(.+?)\]\]',  r'<sup><a name="oftnd\1">\1</a></sup>'),   
    (r'\[\[(.+?)\s(.+?)\]\]',
     r'<a href="\1" class="myLink">\2</a>'),     

#    Нужно доработать чтобы не ловились кавычки внутри HTML <img .." ">
#    (r'"(.+?)"',            r'«\1»'),

    # Bulleted and Numbered Lists
    (r'^  [*](.+?)$',       r'<li>\1</li>'),
    (r'\n\n<li>',           r'\n\n<ul><li>'),
    (r'</li>\n(?!<li>)',    r'</li></ul>\n'),

    # Cite and definitions
    (r'<[[]', '<blockquote>'),
    (r'[]]>', '</blockquote>'),
    
    # Horizontal rule (separator)
    (r'^\-{4,5}$', r'<hr/>'),
    
    # Forced line break
    (r'([^-])\-{3}([^-])', r'\1<br />\2'),        

    # Tables
    (r'^#\|\|', '<table class="dtable" border="0">'),
    (r'^\|\|#', '</table>'),        
    (r'^#\|', '<table class="usertable" border="1">'),
    (r'^\|#', '</table>'),
    (r'\|\|(.+?)\|\|',
         '<tr class="userrow"><td class="usercell">\g<1></td></tr>'),
    (r'\|\s', ' </td><td class="usercell"> '),    
)

TXT_ABOUT = """<h1 id="heading_id_0>От автора</h1>
<h2  id="mbp_toc_0" class="title"> Предисловие к эсперанто&mdash;русскому словарю</h2>"""

TXT_GRAMM = '<h1 class="title">Грамматика эсперанто</h1>'

XHTML_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>EORU</title>
</head>
<body>
  <div>
%s
  </div>
</body>
</html>
"""
# <link href="stylesheet.css" type="text/css" rel="stylesheet" />
# <link rel="stylesheet" type="application/vnd.adobe-page-template+xml" href="page-template.xpgt"/>

def processFile(in_dir, fname, patterns):
    # Обработка исходного текстового файла на основе шаблонов.
    data = open(in_dir + fname + FILE_EXT_TXT,'r',encoding='cp1251').read()
    for p in patterns:
        data = re.sub(p[0], p[1], data, 0, re.DOTALL | re.MULTILINE)
    return data


def main():
    # Текстовые разделы словаря
    patterns = CX2EO + SYMBOLS + WACKO2HTML + FIX_LINKS

    out = []
    for file in os.listdir ( DIR_TEXT ):
        if file[0] == '.': continue
        data = open(DIR_TEXT + file, 'r', encoding='cp1251').read()
        for p in patterns:
            data = re.sub(p[0], p[1], data, 0, re.DOTALL | re.MULTILINE)
        out += data.split('#####')
        
    # Добавляем заголовки     
    out[0] = TXT_GRAMM + out[0]
    out[17] = TXT_ABOUT + out[17]
    
    for fileId, data in enumerate(out):
        open(DIR_MOBI + "page-%d.html" % (fileId + 1), 'w',
             encoding='utf8').write(XHTML_TEMPLATE % data)
    print ("Done!")
main()

